package Buscaminas.Dialogos;

import java.awt.BorderLayout;
import java.awt.Dimension;
import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.IOException;
import java.util.Iterator;

import javax.swing.JButton;
import javax.swing.JDialog;
import javax.swing.JLabel;
import javax.swing.JList;
import javax.swing.JPanel;
import javax.swing.WindowConstants;
import javax.swing.border.TitledBorder;
import javax.swing.event.ListSelectionEvent;
import javax.swing.event.ListSelectionListener;

import Buscaminas.Puntuaciones.Estadisticas;
import Buscaminas.Puntuaciones.ExcepcionPuntuaciones;
import Buscaminas.Puntuaciones.Puntuacion;

@SuppressWarnings("serial")
public class DialogoEstadisticas extends JDialog implements ActionListener, ListSelectionListener{

	/**
	 * Variables de Instancia
	 */
	// Elegir dificultad
	private JList<String> listDificultad;
	// Donde guardaremos los tiempos y nombres de los mejores tiempos
	private JLabel [][]tiempos;
	// Donde guardaremos partidos jugados, ganados, perdidos y porcentaje victoria
	private JLabel lPartJug, lPartGan, lPartPer, lPorcVictoria;
	// Botones inferiores
	private JButton bCerrar, bRestablecer;
	
	// Objetos Estadisticas(mientras no las seleccione el usuario, no inicializaremos las variables, salvo principiante que se carga por defecto)
	private Estadisticas estPincipiante;
	private Estadisticas estIntermedio;
	private Estadisticas estAvanzado;
	
	/**
	 * Constructor
	 * @throws IOException 
	 * @throws ExcepcionPuntuaciones 
	 * @throws NumberFormatException 
	 */
	public DialogoEstadisticas() throws NumberFormatException, ExcepcionPuntuaciones, IOException{
		// Poner el dialogo modal, darle t�tulo y gestor de esquemas
		this.setModal(true);
		this.setTitle("Estadisticas");
		this.setLayout(new BorderLayout());
		
		// Panel Izquierda
		JPanel pIzq = new JPanel();											this.add("West",pIzq);
		String []dificultades = {"Principiante","Intermedio","Avanzado"};
		listDificultad = new JList<String>(dificultades);					pIzq.add(listDificultad);
		listDificultad.setSelectedIndex(0);// Selecciona principiante por defecto
		
		// Panel Centro
		JPanel pCentro = new JPanel(new GridLayout(10, 2));					this.add("Center",pCentro);
		pCentro.setBorder(new TitledBorder("Mejores tiempos"));
		//inicializar tiempos
		tiempos = new JLabel [10][2];
		for(int i=0; i<10; i++){
			tiempos[i][0] = new JLabel();										pCentro.add(tiempos[i][0]);
			tiempos[i][1] = new JLabel();										pCentro.add(tiempos[i][1]);
		}
		
		// Panel Derecha
		JPanel pDer = new JPanel(new GridLayout(4,1));						this.add("East",pDer);
		lPartJug = new JLabel("Partidas Jugadas: ");						pDer.add(lPartJug);
		lPartGan = new JLabel("Partidas Ganadas: ");						pDer.add(lPartGan);
		lPartPer = new JLabel("Partidas Perdidas: ");						pDer.add(lPartPer);
		lPorcVictoria = new JLabel("Porcentaje de Victorias: ");			pDer.add(lPorcVictoria);
		
		// Panel Abajo
		JPanel pAbajo = new JPanel(new GridLayout(1,2));					this.add("South",pAbajo);
		bCerrar = new JButton("Cerrar");									pAbajo.add(bCerrar);
		bRestablecer = new JButton("Restablecer");							pAbajo.add(bRestablecer);
		
		// --Cargar Principiante por defecto--
		cargarPrincipiante();
		// -----------------------------------
		
		// Dar control
		listDificultad.addListSelectionListener(this);
		bCerrar.addActionListener(this);
		bRestablecer.addActionListener(this);
		
		// Control de cierre, pack, setVisible,...
		this.setDefaultCloseOperation(WindowConstants.DO_NOTHING_ON_CLOSE);
		this.setPreferredSize(new Dimension(420,220));
		this.pack();
		this.setVisible(true);
		this.setResizable(false);
	}
	
	/**
	 * M�todos para cargar estadisticas en las variables de instancia
	 */
	public void cargarPrincipiante() throws ExcepcionPuntuaciones, NumberFormatException, IOException{
		// Inicializo el ob Estadisticas en principiante (si no se ha inicializado antes)
		if(estPincipiante == null)estPincipiante = new Estadisticas('p');
		
		estPincipiante.leer();// Carga en las variables de instancia de `estPrincipiante` las puntuaciones de principiante para acceder despues

		limpiarTiempos();// Limpia los tiempos para que si los tiempos nuevos tienen menos puntuaciones, no aparezcan los antiguos
		
		Puntuacion pAux;// Puntuacion auxiliar
		int cont=0;// contador
		Iterator<Puntuacion> i = estPincipiante.getPuntuaciones().iterator();
		while(i.hasNext()){// Mientras hayan mas puntuaciones...
			pAux = i.next();//... las guardo en una Puntuacion auxiliar...
			
			tiempos[cont][0].setText(Integer.toString(pAux.getTiempo()));
			tiempos[cont][1].setText(pAux.getNombre());
			
			cont++;
		}
		
		lPartJug.setText("Partidas Jugadas: "+estPincipiante.getPartidasJugadas());
		lPartGan.setText("Partidas Ganadas: "+estPincipiante.getPartidasGanadas());
		lPartPer.setText("Partidas Perdidas: "+estPincipiante.getPartidasPerdidas());
		lPorcVictoria.setText("Porcentaje de Victorias: "+estPincipiante.getPorcentajeVictorias()+"%");
	}
	
	public void cargarIntermedio() throws ExcepcionPuntuaciones, NumberFormatException, IOException{
		// Inicializo el ob Estadisticas en principiante (si no se ha inicializado antes)
		if(estIntermedio == null)estIntermedio = new Estadisticas('i');
		
		estIntermedio.leer();// Carga en las variables de instancia de `estPrincipiante` las puntuaciones de principiante para acceder despues

		limpiarTiempos();// Limpia los tiempos para que si los tiempos nuevos tienen menos puntuaciones, no aparezcan los antiguos
		
		Puntuacion pAux;// Puntuacion auxiliar
		int cont=0;// contador
		Iterator<Puntuacion> i = estIntermedio.getPuntuaciones().iterator();
		while(i.hasNext()){// Mientras hayan mas puntuaciones...
			pAux = i.next();//... las guardo en una Puntuacion auxiliar...
			
			tiempos[cont][0].setText(Integer.toString(pAux.getTiempo()));
			tiempos[cont][1].setText(pAux.getNombre());
			
			cont++;
		}
		
		lPartJug.setText("Partidas Jugadas: "+estIntermedio.getPartidasJugadas());
		lPartGan.setText("Partidas Ganadas: "+estIntermedio.getPartidasGanadas());
		lPartPer.setText("Partidas Perdidas: "+estIntermedio.getPartidasPerdidas());
		lPorcVictoria.setText("Porcentaje de Victorias: "+estIntermedio.getPorcentajeVictorias()+"%");
	}
	public void cargarAvanzado() throws ExcepcionPuntuaciones, NumberFormatException, IOException{
		// Inicializo el ob Estadisticas en principiante (si no se ha inicializado antes)
		if(estAvanzado == null)estAvanzado = new Estadisticas('a');
		
		estAvanzado.leer();// Carga en las variables de instancia de `estPrincipiante` las puntuaciones de principiante para acceder despues

		limpiarTiempos();// Limpia los tiempos para que si los tiempos nuevos tienen menos puntuaciones, no aparezcan los antiguos
		
		Puntuacion pAux;// Puntuacion auxiliar
		int cont=0;// contador
		Iterator<Puntuacion> i = estAvanzado.getPuntuaciones().iterator();
		while(i.hasNext()){// Mientras hayan mas puntuaciones...
			pAux = i.next();//... las guardo en una Puntuacion auxiliar...
			
			tiempos[cont][0].setText(Integer.toString(pAux.getTiempo()));
			tiempos[cont][1].setText(pAux.getNombre());
			
			cont++;
		}
		
		lPartJug.setText("Partidas Jugadas: "+estAvanzado.getPartidasJugadas());
		lPartGan.setText("Partidas Ganadas: "+estAvanzado.getPartidasGanadas());
		lPartPer.setText("Partidas Perdidas: "+estAvanzado.getPartidasPerdidas());
		lPorcVictoria.setText("Porcentaje de Victorias: "+estAvanzado.getPorcentajeVictorias()+"%");
	}
	
	public void limpiarTiempos(){// limpia los tiempos de los label del panel con Gridlayout(10,2) para volver a rellenarla con otra puntuacion
		for(int i=0; i<10; i++){
			tiempos[i][0].setText("");
			tiempos[i][1].setText("");
		}		
	}
	
	/**
	 * ActionListener
	 */

	public void actionPerformed(ActionEvent e) {
		if(e.getSource() == bRestablecer){//
			
			if(listDificultad.isSelectedIndex(0)){// Principiante
				try {
					
					estPincipiante.restablecer();
					
				} catch (IOException e1) {e1.printStackTrace();}
			}
			
			if(listDificultad.isSelectedIndex(1)){// Intermedio
				try {
					
					estIntermedio.restablecer();
					
				} catch (IOException e1) {e1.printStackTrace();}
			}
			
			if(listDificultad.isSelectedIndex(2)){// Avanzado
				try {
					
					estAvanzado.restablecer();
					
				} catch (IOException e1) {e1.printStackTrace();}
			}
			
			//Vaciar los tiempos y estadisticas
			limpiarTiempos();
			lPartJug.setText("Partidas Jugadas: 0");
			lPartGan.setText("Partidas Ganadas: 0");
			lPartPer.setText("Partidas Perdidas: 0");
			lPorcVictoria.setText("Porcentaje de Victorias: 0.0%");
			
		}
		
		if(e.getSource() == bCerrar){
			this.setVisible(false);
		}
	}

	/**
	 * M�todo de la interfaz ListSelectionListener (JList<String>)
	 */
	public void valueChanged(ListSelectionEvent e) {
		// Unicamente hay un JList, no necesito preguntar por el
		if(listDificultad.isSelectedIndex(0)){// Principiante
			try {
				
				cargarPrincipiante();
				
			} catch (NumberFormatException e1) {
				// TODO Auto-generated catch block
				e1.printStackTrace();
			} catch (ExcepcionPuntuaciones e1) {
				// TODO Auto-generated catch block
				e1.printStackTrace();
			} catch (IOException e1) {
				// TODO Auto-generated catch block
				e1.printStackTrace();
			}
		}
		if(listDificultad.isSelectedIndex(1)){// Intermedio
			try {
				
				cargarIntermedio();
				
			} catch (NumberFormatException e1) {
				// TODO Auto-generated catch block
				e1.printStackTrace();
			} catch (ExcepcionPuntuaciones e1) {
				// TODO Auto-generated catch block
				e1.printStackTrace();
			} catch (IOException e1) {
				// TODO Auto-generated catch block
				e1.printStackTrace();
			}
		}
		if(listDificultad.isSelectedIndex(2)){// Avanzado
			try {
				
				cargarAvanzado();
				
			} catch (NumberFormatException e1) {
				// TODO Auto-generated catch block
				e1.printStackTrace();
			} catch (ExcepcionPuntuaciones e1) {
				// TODO Auto-generated catch block
				e1.printStackTrace();
			} catch (IOException e1) {
				// TODO Auto-generated catch block
				e1.printStackTrace();
			}
		}
	}
	
	/**
	 * Get
	 */
}
